<!DOCTYPE html>












  




<html class="theme-next gemini use-motion" lang="zh-CN">
<head>
  <!-- hexo-inject:begin --><!-- hexo-inject:end --><meta charset="UTF-8"/>
<meta name="google-site-verification" content="o9IkI77-fxkhBZW-n0ww9JALMCqdDbeTgdcXO_Bw4Zc" />
<meta name="baidu-site-verification" content="3frqY9KiVO" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2"/>
<meta name="theme-color" content="#222">



  
  
  <link rel="stylesheet" href="/lib/needsharebutton/needsharebutton.css">










<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />



















  
  
  
  

  
    
    
  

  
    
      
    

    
  

  

  
    
      
    

    
  

  
    
      
    

    
  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Monda:300,300italic,400,400italic,700,700italic|Roboto Slab:300,300italic,400,400italic,700,700italic|Lobster Two:300,300italic,400,400italic,700,700italic|PT Mono:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=6.4.1" rel="stylesheet" type="text/css" />


  <link rel="apple-touch-icon" sizes="180x180" href="/images/logo.png?v=6.4.1">


  <link rel="icon" type="image/png" sizes="32x32" href="/images/logo.png?v=6.4.1">


  <link rel="icon" type="image/png" sizes="16x16" href="/images/logo.png?v=6.4.1">


  <link rel="mask-icon" href="/images/logo.svg?v=6.4.1" color="#222">









<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Gemini',
    version: '6.4.1',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: false,
    fastclick: false,
    lazyload: false,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>


  




  <meta name="description" content="摘要：随着人工智能的快速发展，自然语言处理和机器学习技术的应用愈加广泛。然而身为初学者，要想快速入门这些前沿技术总是存在着各种各样的困难。为使读者对该领域整体概况有一个更为系统明晰的认识，本章1.1节将主要从发展历程、研究现状、应用前景等角度出发，概要地介绍自然语言处理及相关的机器学习技术。接下来1.2节我们将介绍自然语言处理和机器学习之间的关系。古语说“工欲善其事，必先利其器”，本课程的“器”">
<meta name="keywords" content="自然语言处理,NLP">
<meta property="og:type" content="article">
<meta property="og:title" content="自然语言处理入门">
<meta property="og:url" content="https://bainingchao.github.io/2019/02/13/自然语言处理入门/index.html">
<meta property="og:site_name" content="白宁超的官网">
<meta property="og:description" content="摘要：随着人工智能的快速发展，自然语言处理和机器学习技术的应用愈加广泛。然而身为初学者，要想快速入门这些前沿技术总是存在着各种各样的困难。为使读者对该领域整体概况有一个更为系统明晰的认识，本章1.1节将主要从发展历程、研究现状、应用前景等角度出发，概要地介绍自然语言处理及相关的机器学习技术。接下来1.2节我们将介绍自然语言处理和机器学习之间的关系。古语说“工欲善其事，必先利其器”，本课程的“器”">
<meta property="og:locale" content="zh-CN">
<meta property="og:image" content="http://pub.idqqimg.com/wpa/images/group.png">
<meta property="og:image" content="https://i.imgur.com/XUFa4mY.png">
<meta property="og:updated_time" content="2019-02-13T09:57:39.957Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="自然语言处理入门">
<meta name="twitter:description" content="摘要：随着人工智能的快速发展，自然语言处理和机器学习技术的应用愈加广泛。然而身为初学者，要想快速入门这些前沿技术总是存在着各种各样的困难。为使读者对该领域整体概况有一个更为系统明晰的认识，本章1.1节将主要从发展历程、研究现状、应用前景等角度出发，概要地介绍自然语言处理及相关的机器学习技术。接下来1.2节我们将介绍自然语言处理和机器学习之间的关系。古语说“工欲善其事，必先利其器”，本课程的“器”">
<meta name="twitter:image" content="http://pub.idqqimg.com/wpa/images/group.png">



  <link rel="alternate" href="/atom.xml" title="白宁超的官网" type="application/atom+xml" />




  <link rel="canonical" href="https://bainingchao.github.io/2019/02/13/自然语言处理入门/"/>



<script type="text/javascript" id="page.configurations">
  CONFIG.page = {
    sidebar: "",
  };
</script>

  <title>自然语言处理入门 | 白宁超的官网</title>
  









  <noscript>
  <style type="text/css">
    .use-motion .motion-element,
    .use-motion .brand,
    .use-motion .menu-item,
    .sidebar-inner,
    .use-motion .post-block,
    .use-motion .pagination,
    .use-motion .comments,
    .use-motion .post-header,
    .use-motion .post-body,
    .use-motion .collection-title { opacity: initial; }

    .use-motion .logo,
    .use-motion .site-title,
    .use-motion .site-subtitle {
      opacity: initial;
      top: initial;
    }

    .use-motion {
      .logo-line-before i { left: initial; }
      .logo-line-after i { right: initial; }
    }
  </style>
</noscript><!-- hexo-inject:begin --><!-- hexo-inject:end -->

</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-CN">

  
  
    
  

  <!-- hexo-inject:begin --><!-- hexo-inject:end --><div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>

	<!-- <a href="https://github.com/bainingchao"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub"></a> !-->
	
    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">白宁超的官网</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
    
      
        <h1 class="site-subtitle" itemprop="description">专注人工智能领域研究</h1>
      
    
  </div>

  <div class="site-nav-toggle">
    <button aria-label="切换导航栏">
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>



<nav class="site-nav">
  
    <ul id="menu" class="menu">
      
        
        
        
          
          <li class="menu-item menu-item-首页">
    <a href="/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-home"></i> <br />首页</a>
  </li>
        
        
        
          
          <li class="menu-item menu-item-标签">
    <a href="/tags/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />标签</a>
  </li>
        
        
        
          
          <li class="menu-item menu-item-分类">
    <a href="/categories/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-th"></i> <br />分类</a>
  </li>
        
        
        
          
          <li class="menu-item menu-item-归档">
    <a href="/archives/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />归档</a>
  </li>
        
        
        
          
          <li class="menu-item menu-item-视频">
    <a href="/videos/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-sitemap"></i> <br />视频</a>
  </li>
        
        
        
          
          <li class="menu-item menu-item-书籍">
    <a href="/books/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-th"></i> <br />书籍</a>
  </li>
        
        
        
          
          <li class="menu-item menu-item-链接">
    <a href="/links/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-question-circle"></i> <br />链接</a>
  </li>
        
        
        
          
          <li class="menu-item menu-item-关于">
    <a href="/about/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-user"></i> <br />关于</a>
  </li>

      
      
        <li class="menu-item menu-item-search">
          
            <a href="javascript:;" class="popup-trigger">
          
            
              <i class="menu-item-icon fa fa-search fa-fw"></i> <br />搜索</a>
        </li>
      
    </ul>
  

  

  
    <div class="site-search">
      
  <div class="popup search-popup local-search-popup">
  <div class="local-search-header clearfix">
    <span class="search-icon">
      <i class="fa fa-search"></i>
    </span>
    <span class="popup-btn-close">
      <i class="fa fa-times-circle"></i>
    </span>
    <div class="local-search-input-wrapper">
      <input autocomplete="off"
             placeholder="搜索..." spellcheck="false"
             type="text" id="local-search-input">
    </div>
  </div>
  <div id="local-search-result"></div>
</div>



    </div>
  
</nav>



  



</div>
    </header>

    


    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          
            

          
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="https://bainingchao.github.io/2019/02/13/自然语言处理入门/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="白宁超">
      <meta itemprop="description" content="本站主要研究深度学习、机器学习、自然语言处理等前沿技术。ML&NLP交流群：436303759 <span><a target="_blank" href="http://shang.qq.com/wpa/qunwpa?idkey=ef3bbb679b06ac59b136c57ba9e7935ff9d3b10faeabde6e4efcafe523bbbf4d"><img border="0" src="http://pub.idqqimg.com/wpa/images/group.png" alt="自然语言处理和机器学习技术QQ交流：436303759 " title="自然语言处理和机器学习技术交流"></a></span>">
      <meta itemprop="image" content="/../images/header.png">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="白宁超的官网">
    </span>

    
      <header class="post-header">

        
        
          <h2 class="post-title" itemprop="name headline">自然语言处理入门
              
            
          </h2>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              

              
                
              

              <time title="创建时间：2019-02-13 17:55:05 / 修改时间：17:57:39" itemprop="dateCreated datePublished" datetime="2019-02-13T17:55:05+08:00">2019-02-13</time>
            

            
              

              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/自然语言处理/" itemprop="url" rel="index"><span itemprop="name">自然语言处理</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          
            <span class="post-meta-divider">|</span>
            <span class="post-meta-item-icon"
            >
            <i class="fa fa-eye"></i>
             阅读次数： 
            <span class="busuanzi-value" id="busuanzi_value_page_pv" ></span>
            </span>
          
		  

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <blockquote>
<p>摘要：随着人工智能的快速发展，自然语言处理和机器学习技术的应用愈加广泛。然而身为初学者，要想快速入门这些前沿技术总是存在着各种各样的困难。为使读者对该领域整体概况有一个更为系统明晰的认识，本章1.1节将主要从发展历程、研究现状、应用前景等角度出发，概要地介绍自然语言处理及相关的机器学习技术。接下来1.2节我们将介绍自然语言处理和机器学习之间的关系。古语说“工欲善其事，必先利其器”，本课程的“器”就是开发环境部署，本书主要介绍Sublime的安装部署与使用。最后，在章末1.5节我们将用一个简单的实战案例让读者亲身领略编程之美。（本文原创，转载必须注明出处.）</p>
</blockquote>
<a id="more"></a>
<h1 id="初识自然语言处理"><a href="#初识自然语言处理" class="headerlink" title="初识自然语言处理"></a>初识自然语言处理</h1><h2 id="自然语言处理概述"><a href="#自然语言处理概述" class="headerlink" title="自然语言处理概述"></a>自然语言处理概述</h2><blockquote>
<p>什么是自然语言处理</p>
</blockquote>
<p>自然语言处理（英语：Natural Language Processing，简称NLP）是人工智能和语言学交叉领域下的分支学科。该领域主要探讨如何处理及运用自然语言；自然语言认知（即让电脑“ 懂”人类的语言）；自然语言生成系统（将计算机数据转化为自然语言）以及自然语言理解系统（将自然语言转化为计算机程序更易于处理的形式）。</p>
<p>所谓“自然语言”，其实就是我们日常生活中使用的语言（在这里还包括书面文字和语音视频等），人们熟知的汉语、日语、韩语、英语、法语等语言都属于此范畴。至于“自然语言处理”，则是对自然语言进行数字化处理的一种技术；是通过语音文字等形式与计算机进行通信，从而实现“人机交互”的技术。</p>
<blockquote>
<p>自然语言处理学科领域</p>
</blockquote>
<p>多交叉学科：自然语言处理是一门多学科交叉的技术，其中包括：语言学、计算机科学（提供模型表示、算法设计、计算机实现）、数学（数学模型）、心理学（人类言语心理模型和理论）、哲学（提供人类思维和语言的更深层次理论）、统计学（提供样本数据的预测统计技术）、电子工程（信息论基础和语言信号处理技术）、生物学（人类言语行为机制理论）。</p>
<blockquote>
<p>自然语言处理研究方向</p>
</blockquote>
<p>自然语言处理热门的研究方向包括：语音的自动合成与识别、机器翻译、自然语言理解、人机对话、信息检索、文本分类、自动文摘等等。总分为4大方向：</p>
<ol>
<li>语言学方向</li>
<li>数据处理方向</li>
<li>语言工程方向</li>
<li>人工智能和认知科学方向</li>
</ol>
<p>细分为13个方面：</p>
<ol>
<li>口语输入：语音识别、信号表示、鲁棒的语音识别、语音识别中的隐马尔科夫模型方法、语言模型、说话人识别、口语理解；</li>
<li>书面语输入：文献格式识别、光学字符识别（OCR）：印刷体识别/手写体识别、手写界面、手写文字分析； </li>
<li>语言分析理解：小于句子单位的处理、语法的形式化、针对基于约束的语法编写的词表、计算语义学、句子建模和剖析技术、鲁棒的剖析技术；</li>
<li>语言生成：句法生成、深层生成；</li>
<li>口语输入技术：合成语音技术、语音合成的文本解释、口语生成；</li>
<li>话语分析与对话：对话建模、话语建模口语对话系统；</li>
<li>文献自动处理：文献检索、文本解释：信息抽取、文本内容自动归纳、文本写作和编辑的计算机支持、工业和企业中使用的受限语言；</li>
<li>多语问题的计算机处理：机器翻译、人助机译、机助人译、多语言信息检索、多语言语音识别、自动语种验证；</li>
<li>多模态的计算机处理：空间和时间表示方法、文本与图像处理、口语与手势的模态结合、口语与面部信息的模态结合：面部运动和语音识别；</li>
<li>信息传输和信息存储：语音压缩、语音品质的提升；</li>
<li>自然语言处理中的数学方法：统计建模和分类的数学理论、数字信号处理技术、剖析算法的数学基础研究、神经网络、有限状态分析技术、语音和语言处理中的最优化技术和搜索技术；</li>
<li>语言资源：书面语料库、口语语料库、机器词典与词网的建设、术语编撰和术语数据库、网络数据挖掘和信息提取；</li>
<li>自然语言处理系统的评测：面向任务的文本分析评测、机器翻译系统和翻译工具的评测、大覆盖面的自然语言剖析器的评测、语音识别：评估和评测、语音合成评测、系统的可用性和界面的评测、语音通信质量的评测、文字识别系统的评测。</li>
</ol>
<h2 id="自然语言处理发展历史"><a href="#自然语言处理发展历史" class="headerlink" title="自然语言处理发展历史"></a>自然语言处理发展历史</h2><blockquote>
<p>机器翻译发展历程</p>
</blockquote>
<p>自然语言处理的相关研究，最早是从机器翻译系统的研究开始的。20世纪60年代，国外对机器翻译曾有大规模的研究工作，投入了大量的人力物力财力。但是受客观历史因素的限制，当时人们低估了自然语言的复杂性，语言处理的理论和技术均不成熟，所以进展并不大。当时的主要做法是存储两种语言的大辞典，翻译时词汇与短语一一对应，技术上只是调整语言的同条顺序。但日常生活中语言的翻译远远没有那么简单，人们很多时候做翻译还必须参考某句话前后文的意思。机器翻译的发展大致可分为三个时期 :</p>
<ol>
<li>初创期(1947 -1970)： 电子计算机问世(1946)的第二年，英国工程师布斯(A.D.Booth)和美国工程师威弗(W.Weaver)最早提出了利用计算机进行自动翻译。1952年，在洛克菲勒基金会的大力支持下，一些西方学者在美国麻省理工学院召开了第一次机器翻译会议。1954年，《机械翻译》(Mechanical Translation)杂志开始公开发行。同年， 世界上第一次机器翻译试验成功开展。虽然这次试验用的机器词汇仅仅包含了250个俄语单词和6条机器语法规则，但是它第一次向公众和学界展示了机器翻译的可行性，也激发了美国政府在随后十余年对机器翻译进行大量资助的兴趣。然而随着研究的深入，人们看到的不是机器翻译的成功，而是一个又一个它无法克服的局限。第一代机器翻译系统设计上的粗糙所带来的翻译质量低劣最终导致了一些人对机器翻译失去了信心，甚至有人认为机器翻译研究追求“全自动、高质量”的目标是不可能实现的。这一系列挫折标志着机器翻译研究在60年代末期逐步陷入低谷。</li>
<li>复苏期(1970 -1976)： 尽管机器翻译困难重重，但是法国、日本、加拿大等国仍然没有放弃研究。在70年代初期，机器翻译终于出现了复苏的局面。在这个时期，研究者们普遍认识到“原语”和“译语”两种语言的差异。这不仅仅是词汇上的不同，而且还存在句法结构上的区别。为了得到可读性更强的译文，就必须在自动句法分析上多下功夫。通过大量的科学实验，机器翻译的研究者们终于逐渐认识到机器翻译过程本身必须保持“原语”和“译语”在语义上的一致，一个好的机器翻译系统应该把“原语”的语义准确无误地在“译语”中表现出来。于是，语义分析在机器翻译中越来越受到重视。美国斯坦福大学的威尔克斯(Y.A.Wilks)于1974年提出了“优选语义学”，并在此基础上设计了英法机器翻译系统。由于这个系统的语义表示方法比较细致，能够解决仅用句法分析难于解决的歧义现象、代词所指等困难问题，译文质量较高，从而受到专家学者们的一致肯定。</li>
<li>繁荣期(1976 —至今)： 繁荣期最突出的特点是机器翻译研究走上了实用化的道路，出现了一大批实用化的机器翻译系统。紧接着，机器翻译产品又开始进入市场，逐渐由实用化步入商业化。第二代机器翻译系统以基于转换的方法为代表，普遍采用以句法分析为主、语义分析为辅的基于规则的方法，采用由抽象的转换表示的分层次实现策略。比如加拿大蒙特利尔大学开发研制的实用性机器翻译系统TAUM-METEO就是采用了典型的转换方法，整个翻译过程分为5个阶段(英-法翻译):英语形态分析、英语句法分析、转换 、法语句法生成和法语形态生成。这个翻译系统投入使用之后，每小时可以翻译6万-30万个词，每天可以翻译1500-2000篇天气预报的讯息并能够通过电视、报纸立即公布。TAUM-METEO系统是“机器翻译发展史上的一个里程碑 ，它标志着机器翻译由复苏走向了繁荣”。</li>
</ol>
<blockquote>
<p>我国机器翻译发展历程</p>
</blockquote>
<p>我国机器翻译的起步并不算太晚，是继美国、前苏联、英国之后世界上第四个开展机器翻译研究的国家。早在20世纪50年代机器翻译就被列入我国科学研究的发展规划。一些研究人员还进行了俄汉机器翻译实验，取得了一定的研究成果。我国机器翻译研究的全面开展始于80年代中期，特别是90年代以降，一批机器翻译系统相继问世，其中影响力较大的有:中软总公司开发的汉英-汉日翻译系统(1993);中科院计算所研制的IMTEC英汉翻译系统(1992)等。</p>
<p>在自然语言处理的形成和发展进程中， 除机器翻译外，自然语言理解(Natural Language Understanding)所起到的作用也是不可忽视的。自然语言理解的发展始于20世纪60年代中期机器翻译处于举步维艰之时，到了70年代初，它的研究已获得了累累硕果。自然语言理解，又称“人机对话”，就是“让计算机理解自然语言，使计算机获得人类理解自然语言的智能，并对人给计算机提出的问题，通过对话的方式，用自然语言进行回答”。60年代中期，人们开始由“词对词”的翻译方式逐步转入对自然语言的语法、语义和语用等基本问题的研究，并尝试着让计算机来理解自然语言。许多学者认为，判断计算机是否理解了自然语言的最直观方法，就是让人们同计算机对话，如果计算机对人提出的问题能做出有意义的回答，那就证明计算机已经理解了自然语言。最初的“人机对话”系统(或“自然语言理解”系统)研究工作主要在美国。冯志伟教授把第一代自然语言理解系统分为四种类型 :</p>
<ol>
<li>特殊格式系统。即根据人机对话内容的特点 ，采用特定的格式来进行人机对话;</li>
<li>以文本为基础的系统。某些研究者不满意在特殊格式系统中种种格式限制，因为就一个专门领域来说，最方便的还是使用不受特殊格式结构限制的系统来进行人机对话;</li>
<li>有限逻辑系统。在这种系统中，自然语言的句子以某种更加形式化的记号来替代，这些记号自成一个有限逻辑系统， 可以进行某些推理;</li>
<li>一般演绎系统。它使用某些标准数学符号来表达信息，可以表达那些在有限逻辑系统中不容易表达出来的复杂信息从而进一步提高了自然语言理解系统的能力。随着研究的进一步深入，第二代自然语言理解系统应运而生。这些系统绝大多数是程序演绎系统，大量地进行语义、语境以至语用的分析，输入输出都是用书面文字。口头的自然语言理解系统还牵扯到语音识别、语音合成等复杂的技术，发展速度比较缓慢。</li>
</ol>
<blockquote>
<p>自然语言处理发展历程</p>
</blockquote>
<ul>
<li><p>1948年，香农（Shannon）把离散马尔可夫过程的概率模型应用于描述语言的自动机;同时又把“熵” (entropy)的概念引用到语言处理中。而克莱尼(Kleene)在同一时期研究了有限自动机和正则表达式。 </p>
</li>
<li><p>1956年，乔姆斯基（Chomsky）提出了上下文无关语法。这一工作导致了基于规则和基于概率两种不同的自然语言处理方法的诞生，使得该领域的研究分成了采用规则方法的符号派(symbolic)和采用概率方法的随机派(stochastic)两大阵营 ， 进而引发了数十年有关这两种方法孰优孰劣的争执 。同年，人工智能诞生以后，自然语言处理迅速融入了人工智能的研究中。随机派学者在这一时期利用贝叶斯方法等统计学原理取得了一定的进步;而以 Chomsky为代表的符号派也进行了形式语言理论生成句法和形式逻辑系统的研究。由于这一时期多数学者注重研究推理和逻辑问题， 只有少数学者在研究统计方法和神经网络，因此符号派的势头明显强于随机派的势头。</p>
</li>
<li><p>1967年，美国心理学家 Neisser提出了认知心理学， 从而把自然语言处理与人类的认知联系起来。</p>
</li>
<li><p>70年代初，由于自然语言处理研究中的一些问题未能在短时间内得到解决，而新的问题又不断涌现，许多人因此丧失了信心，自然语言处理的研究进入了低谷时期。尽管如此，一些发达国家的学者依旧没有停止。基于隐马尔可夫模型 (Hidden Markov Model，HMM)的统计方法和话语分析 (Discourse Analysis)在这一时期取得了重大进展 。</p>
</li>
<li><p>80年代， 在人们对过去的工作进行反思之后 ， 有限状态模型和经验主义的研究方法开始复苏 。</p>
</li>
<li><p>90年代以后，随着计算机的速度和存储量大幅增加，自然语言处理的物质基础大幅改善，语音和语言处理的商品化开发成为可能。同时，网络技术的发展和Internet的逐步商业化使得基于自然语言的信息检索和信息抽取需求变得更加突出，自然语言处理的应用面渐渐不再局限于机器翻译、语音控制等早期研究领域。</p>
</li>
<li><p>从90年代末到21世纪初 ，人们逐渐认识到仅用基于规则的方法或仅用基于统计的方法，都是无法成功进行自然语言处理的。基于统计、基于实例和基于规则的语料库技术在这一时期开始蓬勃发展， 各种处理技术开始融合，自然语言处理的研究又开始兴旺起来。</p>
</li>
</ul>
<h2 id="自然语言处理工作原理"><a href="#自然语言处理工作原理" class="headerlink" title="自然语言处理工作原理"></a>自然语言处理工作原理</h2><p>计算机处理自然语言的过程：形式化描述——数学模型算法化——程序化——实用化。具体步骤如下：</p>
<ol>
<li>形式化描述： 把需要研究的问题在语言上建立形式化模型，使其可以以数学形式表示出来；</li>
<li>数学模型算法化： 把数学模型表示为算法的过程称之为“算法化“；</li>
<li>程序化：计算机根据算法进行实现，建立各种自然语言处理系统，这个过程是“程序化“；</li>
<li>实用化： 对系统进行评测和改进最终满足现实需求，这个过程是“实用化“。</li>
</ol>
<h2 id="自然语言处理应用前景"><a href="#自然语言处理应用前景" class="headerlink" title="自然语言处理应用前景"></a>自然语言处理应用前景</h2><p>随着自然语言处理的蓬勃发展和深入研究，新的应用方向会不断呈现出来。自然语言处理发展前景十分广阔，主要研究领域有：</p>
<ul>
<li>文本方面：基于自然语言理解的智能搜索引擎和智能检索、智能机器翻译、自动摘要与文本综合、文本分类与文件整理、智能自动作文系统、自动判卷系统、信息过滤与垃圾邮件处理、文学研究与古文研究、语法校对、文本数据挖掘与智能决策、基于自然语言的计算机程序设计等；</li>
<li>语音方面：机器同声传译、智能远程教学与答疑、语音控制、智能客户服务、机器聊天与智能参谋、智能交通信息服务、智能解说与体育新闻实时解说 、语音挖掘与多媒体挖掘、多媒体信息提取与文本转化、对残疾人智能帮助系统等。</li>
</ul>
<h1 id="自然语言处理与机器学习"><a href="#自然语言处理与机器学习" class="headerlink" title="自然语言处理与机器学习"></a>自然语言处理与机器学习</h1><h2 id="机器学习概述"><a href="#机器学习概述" class="headerlink" title="机器学习概述"></a>机器学习概述</h2><blockquote>
<p>什么是机器学习</p>
</blockquote>
<p>机器学习是人工智能的一个分支，研究从以“推理”为重点到以“知识”为重点，再到以“学习”为重点。显然，机器学习是实现人工智能的一个途径，即以机器学习为手段解决人工智能中的问题。机器学习在近30多年的时间里已发展成为一门多领域交叉学科，涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多种知识。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。机器学习算法是一类从数据中自动分析获得规律，并利用规律对未知数据进行预测的算法。因为学习算法中涉及了大量的统计学理论，机器学习与推断统计学联系尤为密切，也被称为统计学习理论。算法设计方面，机器学习理论关注可以实现的，行之有效的学习算法。很多推论问题属于无程序可循难度，所以部分的机器学习研究是开发容易处理的近似算法。<br>机器学习现已广泛应用于数据挖掘、计算机视觉、自然语言处理、生物特征识别、搜索引擎、医学诊断、检测信用卡欺诈、证券市场分析、DNA序列测序、语音和手写识别、战略游戏和机器人等领域。</p>
<p>机器学习是“计算机利用经验自动改善系统自身性能的行为”。换言之，机器学习是指通过计算机学习数据中的内在规律性信息，获得新的经验和知识，以提高计算机的智能性，让计算机能够像人那样去决策。本质上机器学习是一个从未知到已知的过程。假设计算机拥有这样一个程序，随着机器解决问题的增多，在该程序的作用下，机器性能或解决问题的能力增强，我们就说这台机器拥有学习能力。机器解决问题能力的增强主要表现在：初始状态下，对于问题Q，机器给出结果A，该机器在解决一系列问题{Q1，Q2，… ，Qn}后，再次遇到问题Q时给出结果A1，而结果 A1比结果A更精确，我们就说机器解决问题的能力得到了增强。</p>
<h2 id="机器学习发展历程"><a href="#机器学习发展历程" class="headerlink" title="机器学习发展历程"></a>机器学习发展历程</h2><blockquote>
<p>机器学习发展简史</p>
</blockquote>
<ul>
<li>1943年， Warren McCulloch 和 Walter Pitts 提出了神经网络层次结构模型 ，确立了神经网络的计算模型理论，从而为机器学习的发展奠定了基础。</li>
<li>1950年， “人工智能之父”图灵提出了著名的“图灵测试”，使人工智能成为了计算机领域一个重要的研究课题。</li>
<li>1957年， 康内尔大学教授 Frank Rosenblatt 提出Perceptron 概念，并且首次用算法精确定义了自组织自学习的神经网络数学模型， 设计出了第一个计算机神经网络，这个机器学习算法成为神经网络模型的开山鼻祖。</li>
<li>1959年， 美国 IBM 公司的 A．M．Samuel设计了一个具有学习能力的跳棋程序，它曾经战胜了美国一个保持 8 年不败的冠军。这个程序向人们初步展示了机器学习的能力。</li>
<li>1962年， Hubel 和 Wiesel 发现猫脑皮层中独特的神经网络结构可以有效降低学习的复杂性， 从而提出著名的 Hubel－Wiesel 生物视觉模型， 以后提出的神经网络模型均受此启迪。</li>
<li>1969 年， 人工智能研究的先驱者 Marvin Minsky和 Seymour Papert 出版了对机器学习研究具有深远影响的著作《Perceptron》， 虽然提出的 XOR 问题把感知机研究送上了不归路，此后的十几年基于神经网络的人工智能研究进入低潮。 但其对于机器学习基本思想的论断（解决问题的算法能力和计算复杂性）却影响深远。</li>
<li>1980 年， 在美国卡内基·梅隆大学举行了第一届机器学习国际研讨会， 标志着机器学习研究在世界范围内兴起。1986 年， 《Machine Learning》创刊，标志着机器学习逐渐为世人瞩目并开始加速发展。</li>
<li>1982 年， Hopfield 发表了一篇关于神经网络模型的论文，构造出能量函数并把这一概念引入Hopfield 网络，同时通过对动力系统性质的认识， 实现了 Hopfield 网络的最优化求解， 推动了神经网络的深入研究和发展应用。</li>
<li>1986 年，Rumelhart、Hinton 和 Williams 联合在《自然》杂志发表了著名的反向传播算法(BP) ， 首次阐述了 BP 算法在浅层前向型神经网络模型的应用。这一算法不但明显降低了最优化问题求解的运算量，还通过增加一个隐层解决了感知器无法解决的 XOR Gate 难题。BP算法很快成为神经网络的最基本算法，从此神经网络的研究与应用开始复苏。</li>
<li>1989 年， 美国贝尔实验室学者 Yann LeCun 教授提出了目前最为流行的卷积神经网络( CNN) 计算模型，推导出基于 BP 算法的高效训练方法， 并成功地应用于英文手写体识别。CNN 是第一个被成功训练的人工神经网络，也是后来深度学习最成功、应用最广泛的模型之一。</li>
<li>90 年代后， 多种浅层机器学习模型相继问世，诸如逻辑回归、支持向量机等， 这些机器学习算法的共性是数学模型为凸代价函数的最优化问题，理论分析相对简单，训练方法也容易掌握，易于从训练样本中学习到内在模式，来完成对象识别、任务分类等初级智能工作。基于统计规律的浅层学习方法比起传统的基于规则的方法具备很多优越性， 取得了不少成功的商业应用的同时， 浅层学习的问题逐渐暴露出来，由于有限的样本和计算单元导致对数据间复杂函数的表示能力有限，学习能力不强，只能提取初级特征。</li>
<li>2006 年， 在学界及工业界巨大需求的刺激下， 计算机硬件技术迅速发展并为机器学习进行超强度的计算提供了可能。机器学习领域的泰斗 Geoffrey Hinton 和 Ruslan Salakhutdinov 发表文章，提出了深度学习模型， 主要论点包括：多个隐层的人工神经网络具有良好的特征学习能力；通过逐层初始化来克服训练的难度，实现网络整体调优。这个模型的提出开启了深度神经网络机器学习的新时代。</li>
<li>2012 年， Hinton 研究团队采用深度学习模型赢得计算机视觉领域最具影响力的 ImageNet 比赛冠军，从而标志着深度学习进入第二个阶段。</li>
</ul>
<p>至今， 随着Hinton、LeCun 和 Andrew Ng 对深度学习的不断深入研究，以及云计算、大数据、计算机硬件技术的不断发展，深度学习许多领域逐渐取得了令人赞叹的进展，推出了一批成功的商业应用，诸如谷歌翻译、苹果语音工具 Siri、微软的 Cortana 个人语音助手、蚂蚁金服的 Smile to Pay 扫脸技术等。深度学习是目前最接近人类大脑分层的智能学习方法，它通过建立类似于人脑的分层结构模型，突破浅层学习的限制，能够表征更为复杂的函数关系。通过对输入数据逐层提取特征并加以抽象，建立从底层简单特征到高层抽象语义的非线性映射关系，机器学习在智能方向又获得了进一步提升，这成为了机器学习的一个里程碑。</p>
<h2 id="机器学习应用前景"><a href="#机器学习应用前景" class="headerlink" title="机器学习应用前景"></a>机器学习应用前景</h2><p>2016年，举世瞩目的人机大战以 AlphaGo四比一李世石而告终。这一事件在震惊世人的同时，更让人感受到了机器学习的强大威力，昭示出机器学习研究与应用的灿烂前景。以此为契机， 机器学习理论研究势必成为一个新的热点，在认知计算、类脑计算的支撑下向更高阶段发展，出现性能更好、结构优化、学习高效、功能强大的机器模型，非监督机器学习也将会取得实质性的进展。机器学习的自主学习能力将进一步提高，逐渐跨越弱人工智能阶段，不断提高智能性。随着机器学习与大数据、云计算、物联网的深度融合，将会掀起一场新的数字化技术革命。借助自然语言理解、情感及行为理解将会开启更加友好的人机交互新界面；自动驾驶汽车将成为现实；我们的工作生活中将出现更多的智能机器人；在医疗、金融、教育等行业将能够给我们提供更多智能化、个性化服务定制服务；机器学习一定会造福于我们整个人类，使明天的生活更加美好!</p>
<h1 id="自然语言处理与机器学习的联系"><a href="#自然语言处理与机器学习的联系" class="headerlink" title="自然语言处理与机器学习的联系"></a>自然语言处理与机器学习的联系</h1><h2 id="自然语言处理和机器学习的联系"><a href="#自然语言处理和机器学习的联系" class="headerlink" title="自然语言处理和机器学习的联系"></a>自然语言处理和机器学习的联系</h2><p>语言是人类区别于其他动物的本质特性。在所有生物中，只有人类才具有语言能力，人类的多种智能都与语言有着密切的关系。人类的逻辑思维以语言为形式，人类的绝大部分知识也是以语言文字的形式记载和流传下来的。因而，语言无疑是人工智能（以机器学习和深度学习为代表）的一个重要，乃至核心部分。<br>用自然语言与计算机进行通信，这是人们长久以来的梦想。实现人机间的自然语言通信意味着要使计算机既能理解自然语言文本的意义，也能以自然语言文本来表达给定的意图与思想。前者称为自然语言理解，后者称为自然语言生成，它们都是自然语言处理的重要组成部分。无论是实现自然语言理解，还是自然语言生成，事实上都远不如人们原先想象得那么简单。从现有的理论和技术看，通用的、高质量的自然语言处理系统仍然是较长期的努力目标。但是针对一定应用，具有相当自然语言处理能力的实用系统已经出现，甚至商品化、产业化。典型的例子有：多语种数据库和专家系统的自然语言接口、各种机器翻译系统、全文信息检索系统、自动文摘系统等。</p>
<p>现代NLP算法主要基于机器学习，特别是统计机器学习。机器学习范式不同于之前一般的尝试语言处理。语言处理任务的实现，通常涉及直接用手的大套规则编码。许多不同类的机器学习算法已应用于自然语言处理任务。这些算法的输入是一大组从输入数据中生成的“特征”。一些最早使用的算法如决策树，产生硬的if-then规则类似于手写的规则，是再普通不过的系统体系。然而，越来越多的研究集中于统计模型，这使得基于附加实数值的权重，每个输入要素柔软，概率的决策。此类模型能够表达许多不同的可能答案，而不仅仅只有一个相对的确定性。<br>自然语言处理研究已逐渐从词汇语义转移到更进一步地叙事理解。然而要想达到人类的语言水平，这对人工智能而言尚是一个十分复杂的问题。自然语言处理与AI相互依赖、相互影响，二者的未来必将紧密结合起来。</p>
<h2 id="寄语"><a href="#寄语" class="headerlink" title="寄语"></a>寄语</h2><p>机器学习本身比较偏底层和理论，只有结合了具体的自然语言处理以及数据挖掘的问题才足够炫酷。机器学习好像内力一样，是一个武者的基础，而自然语言和数据挖掘的东西都是招式。如果你内功足够深厚，招式对你来说都是小意思。另外，机器学习还需要有足够的数学基础。现实生活中有很多学生一方面对机器学习爱得狂热，而另一方面却对矩阵、概率论等数学知识恨得深沉。其实，现在如果我们只讲工程实现，网络上有很多开源工具可供大家使用，你只需要照着攻略“依葫芦画瓢”就可以了。但我窃以为，如果你真的学不好矩阵、概率、微积分，不如早日勤动手、多编程。大家一定不要舍本逐末地忽视了程序员最基础的编程功夫，即使日后咱们玩不转机器学习，过硬的基本功也对日后工作研究十分有利！</p>
<h1 id="自然语言处理开发工具与环境"><a href="#自然语言处理开发工具与环境" class="headerlink" title="自然语言处理开发工具与环境"></a>自然语言处理开发工具与环境</h1><h2 id="Sublime-Text和Anaconda介绍"><a href="#Sublime-Text和Anaconda介绍" class="headerlink" title="Sublime Text和Anaconda介绍"></a>Sublime Text和Anaconda介绍</h2><blockquote>
<p>Sublime Text简介</p>
</blockquote>
<p>Sublime Text是一套跨平台的文本编辑器，支持基于Python的插件。Sublime Text 是专有软件，可通过包Package扩充本身的功能。大多数的包使用自由软件授权发布，并由社区建设维护。Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来，它最初被设计为一个具有丰富扩展功能的Vim。其具有漂亮的用户界面和强大的功能，例如代码缩略图，Python的插件，代码段等。还可自定义键绑定，菜单和工具栏。Sublime Text 的主要功能包括：拼写检查，书签，完整的 Python API ， Goto 功能，即时项目切换，多选择，多窗口等等。Sublime Text 是一个跨平台的编辑器，同时支持Windows、Linux、Mac OS X等操作系统。</p>
<p>Sublime Text 支持众多编程语言，并支持语法上色。内置支持的编程语言包含：ActionScript、AppleScript、ASP、batch files、C、C++、C#、Clojure、CSS、D、Diff、Erlang、Go、Graphviz (DOT)、Groovy、Haskell、HTML、Java、JSP、JavaScript、JSON、LaTeX、Lisp、Lua、Makefiles、Markdown、MATLAB、Objective-C、OCaml、Perl、PHP、Python、R、Rails、Regular Expressions、reStructuredText、Ruby、Scala、shell scripts (Bash)、SQL、Tcl、Textile、XML、XSL 和 YAML。用户可通过下载外挂支持更多的编程语言。</p>
<blockquote>
<p>Sublime Text优点</p>
</blockquote>
<ul>
<li>主流前端开发编辑器</li>
<li>体积较小，运行速度快</li>
<li>文本功能强大</li>
<li>支持编译功能且可在控制台看到输出</li>
<li>内嵌python解释器支持插件开发以达到可扩展目的</li>
<li>Package Control：ST支持的大量插件可通过其进行管理</li>
</ul>
<blockquote>
<p>Anaconda简介</p>
</blockquote>
<p>Anaconda是一个用于科学计算的Python发行版，支持 Linux, Mac, Windows系统，提供了包管理与环境管理的功能，可以很方便地解决多版本python并存、切换以及各种第三方包安装问题。Anaconda利用工具/命令conda来进行package和environment的管理，并且已经包含了Python和相关的配套工具。这里先解释下conda、anaconda这些概念的差别。conda可以理解为一个工具，也是一个可执行命令，其核心功能是包管理与环境管理。包管理与pip的使用类似，环境管理则允许用户方便地安装不同版本的python并可以快速切换。Anaconda则是一个打包的集合，里面预装好了conda、某个版本的python、众多packages、科学计算工具等等，所以也称为Python的一种发行版。其实还有Miniconda，顾名思义，它只包含最基本的内容——python与conda，以及相关的必须依赖项，对于空间要求严格的用户，Miniconda是一个不错的选择。</p>
<h2 id="开发环境安装与配置"><a href="#开发环境安装与配置" class="headerlink" title="开发环境安装与配置"></a>开发环境安装与配置</h2><blockquote>
<p>工具包的准备</p>
</blockquote>
<p>本文主要介绍Windows下的安装配置，关于Linux和MacOS下的安装，后文给出了扩展文章，需要的读者可自行在线下载。Sublime Text3安装包下载地址（<a href="http://www.sublimetext.com/3" target="_blank" rel="noopener">http://www.sublimetext.com/3</a>）。点击该网址进入Sublime主页，根据本机操作系统选择相关工具包下载。本文示范下载Windows64 bit。具体详见下图1-1：</p>
<center>

![](https://i.imgur.com/MUCnx5E.png)

图1-1 Sublime Text3下载页面
</center>

<p>Anaconda安装包下载地址（<a href="https://www.anaconda.com/download/" target="_blank" rel="noopener">https://www.anaconda.com/download/</a>）进入下载页面显示Python3.0以上版本和Python2.0以上版本。关于Python3和Python2的区别请访问（<a href="http://www.runoob.com/python/python-2x-3x.html" target="_blank" rel="noopener">http://www.runoob.com/python/python-2x-3x.html</a>）查看，在此不做赘述。一般推荐下载Python3.0以上版本。具体详见图1-2所示：</p>
<center>
![](https://i.imgur.com/ZBzco0P.png)

图1-2 Anaconda下载页面
</center>
> Anaconda安装

(1) 安装Anaconda集成环境，将下载后的Anaconda包双击打开如图1-3所示：

<center>
![](https://i.imgur.com/Xl3Vmg0.png)

图1-3 Anaconda安装页面
</center>
(2) 然后一直“Next”下去，直到完成配置。（环境变量自动配置），配置完成后，查看是否成功。打开主菜单->所有应用查看安装，如图1-4所示：
<center>
![](https://i.imgur.com/0oh6nE1.png)

图1-4 主菜单Anaconda完成界面
</center>
(3) 打开cmd进入dos命令下，输入conda list 查看集成的python包。如图1-5所示：
<center>
![](https://i.imgur.com/DaLA98q.png)

图1-5 查看Python集成包
</center>
(4) 如果想添加新的python包，打开Anaconda官网：https://anaconda.org/search进行查找，比如想找到机器学习工具包scikit-learn如图1-6所示：
<center>
![](https://i.imgur.com/r73tT7n.png)

图1-6 下载scikit-learn包
</center>
至此我们就完成了Anaconda安装配置工作，以及对包文件的自定义下载安装。需要注明的是Anaconda自身集成了Python、pip、nltk、numpy、matplotlib等一系列常用包。现在，我们已经可以对python进行操作了。考虑到熟悉python开发的人员，常用Pycharm开发工具，熟悉java的开发人员常用Eclipse开发工具，熟悉C#的开发人员常用VS开发工具。然后我们将Anaconda集成到PyDev、Pycharm、Eclipse、VS等编译环境即可，诸如此类就不一一列举了。考虑到新学一种语言要重新学习一种编程环境，这样极其不方便。那么能不能找到一款编程工具可以通用以上语言？或许这样还不够，如果它还能跨Linux、Windows、MacOS那就更好了。本书强烈推荐的Sublime跨平台跨语言编辑器事实上就是这样一款强大的工具。我们接下来唯一要做的，就是将Anaconda集成到sublime中就可以了。
扩展：linux和MacOS安装教程请访问（https://docs.continuum.io/anaconda/install/）。

> Sublime Text3 安装

(1) 将下载好的Sublime Text3工具包双击到如下界面：如图1-7所示：
<center>
![](https://i.imgur.com/jIUG68H.png)

图1-7 Sublime Text3安装界面
</center>
(2) 一直执行“Next”一路安装即可，中间保存路径可以自定义。最终安装成功将如图1-8所示：
<center>
![](https://i.imgur.com/9gZEPNn.png)

图1-8 Sublime Text3安装成功
</center>
(3) 安装插件Package Control。打开（ https://packagecontrol.io/installation）复制Sublime Text3中的代码如图1-9所示：
<center>
![](https://i.imgur.com/yeIK9sK.png)

图1-9 Package Control代码
</center>
(4) 点击“Ctrl+`”，将3中文本代码内容复制粘贴到文本框中，按Enter即可。如图1-10所示：
<center>
![](https://i.imgur.com/0wOqdIU.png)

图1-10 安装Package Control
</center>
(5) 成功安装后，在Sublime Text3中同时按住“Ctrl+Shift+P”键盘。最终安装成功：如图1-11所示：
<center>
![](https://i.imgur.com/K0ELBU9.png)

图1-11 成功安装Package Control
</center>
(6) 点击“Packeage Control:Install Package”进入查找python环境配置插件“SublimeREPL”，下载安装完成后，点击“Preferences->Browse Package...”查看安装的包如图1-12所示：
<center>
![](https://i.imgur.com/l6h3uYW.png)

图1-12 查看安装插件
</center>
(7) 自定义快捷键盘配置：打开Preferences > Key Bindings输入如下代码，F5运行程序，F6切换IDEL工具，Ctrl+D自定义删除行，其他快捷键是通用的，网上有很多快捷键的资料，这里不赘述。

<pre>
[
    {
    "keys": ["f5"],
    "caption": "SublimeREPL: Python - RUN current file",
    "command": "run_existing_window_command",
    "args": {
        "id": "repl_python_run",
        "file": "config/Python/Main.sublime-menu"
    }
}, {
    "keys": ["f6"],
    "caption": "SublimeREPL: Python",
    "command": "run_existing_window_command",
    "args": {
        "id": "repl_python",
        "file": "config/Python/Main.sublime-menu"
    }
},{
    "keys": ["ctrl+d"],
    "command":"run_macro_file",
    "args": {"file":"res://Packages/Default/Delete Line.sublime-macro"}
}
]
</pre> 

至此完成了Sublime Text3安装配置工作，详细插件安装参考网址（[http://www.open-open.com/news/view/26d731](http://www.open-open.com/news/view/26d731)），快捷键使用请查看（[https://segmentfault.com/a/1190000004463984](https://segmentfault.com/a/1190000004463984)）。还有问题的读者可以自行上网检索，由于资料较多且比较容易实现，本书不再详写。

# 实战：第一个小程序的诞生
## 实例介绍

> 编写一个可以智能数据计算的小程序，用户输入公式如“10/(2+3)”，自动提示计算结果。

## 源码实现
本实例设计思路如下：


- 如下①中采用def定义函数名，python不采用花括号，而是用冒号代替代码块，形参中param是一个自动识别类型的参数。
- 如下②中基本的计算公式，记住结尾没有分号
- 如下③是对结果的输入。
- 如下④类似于C、C#、Java中的主函数，后面章节会项目介绍。
- 如下⑤是对函数名的调用，并且直接传递列表参数，暂时不理解也没有关系，详见第二章。

源码如下（源码下载见https://github.com/BaiNingchao/NLP&ML/01chapter/1.1py）：
<pre>
def countNum(param):                       ①
    result = param[0]/(param[1]+param[2])  ②
    print("this count: "+str(result))      ③  

if __name__=="__main__":                   ④
    countNum([10,2,3])                     ⑤
</pre>
运行结果如1-13所示：
<center>
![](https://i.imgur.com/YXTvFgr.png)

图1-13 第一个小程序
</center>


<hr>
<h1 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h1><ol>
<li>数据挖掘十大算法：<a href="https://wizardforcel.gitbooks.io/dm-algo-top10/content/apriori.html" target="_blank" rel="noopener">https://wizardforcel.gitbooks.io/dm-algo-top10/content/apriori.html</a></li>
<li>中文维基百科：<a href="https://zh.wikipedia.org/wiki/%E5%85%88%E9%AA%8C%E7%AE%97%E6%B3%95" target="_blank" rel="noopener">https://zh.wikipedia.org/wiki/%E5%85%88%E9%AA%8C%E7%AE%97%E6%B3%95</a></li>
<li>GitHub：<a href="https://github.com/BaiNingchao/MachineLearning-1" target="_blank" rel="noopener">https://github.com/BaiNingchao/MachineLearning-1</a></li>
<li>图书：《机器学习实战》</li>
<li><a href="https://baike.baidu.com/item/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86%E7%90%86%E8%AE%BA%E4%B8%8E%E5%AE%9E%E6%88%98" target="_blank" rel="noopener">图书：《自然语言处理理论与实战》</a></li>
</ol>
<h1 id="完整代码下载"><a href="#完整代码下载" class="headerlink" title="完整代码下载"></a>完整代码下载</h1><blockquote>
<p>源码请进【机器学习和自然语言QQ群：436303759】文件下载：<a target="_blank" href="http://shang.qq.com/wpa/qunwpa?idkey=ef3bbb679b06ac59b136c57ba9e7935ff9d3b10faeabde6e4efcafe523bbbf4d"><img border="0" src="http://pub.idqqimg.com/wpa/images/group.png" alt="自然语言处理和机器学习技术QQ交流" title="自然语言处理和机器学习技术交流"></a></p>
</blockquote>
<p><img src="https://i.imgur.com/XUFa4mY.png" alt=""></p>
<h1 id="作者声明"><a href="#作者声明" class="headerlink" title="作者声明"></a>作者声明</h1><blockquote>
<p>本文版权归作者所有，旨在技术交流使用。未经作者同意禁止转载，转载后需在文章页面明显位置给出原文连接，否则相关责任自行承担。</p>
</blockquote>

      
    </div>

    

    
    
    

    
      <div>
        <div id="wechat_subscriber" style="display: block; padding: 10px 0; margin: 20px auto; width: 100%; text-align: center">
    <img id="wechat_subscriber_qcode" src="/uploads/wechat.png" alt="白宁超 wechat" style="width: 200px; max-width: 100%;"/>
    <div>扫一扫关注微信公众号，机器学习和自然语言处理，订阅号datathinks！</div>
</div>

      </div>
    

    
      <div>
        <div style="padding: 10px 0; margin: 20px auto; width: 90%; text-align: center;">
  <div></div>
  <button id="rewardButton" disable="enable" onclick="var qr = document.getElementById('QR'); if (qr.style.display === 'none') {qr.style.display='block';} else {qr.style.display='none'}">
    <span>打赏</span>
  </button>
  <div id="QR" style="display: none;">

    
      <div id="wechat" style="display: inline-block">
        <img id="wechat_qr" src="/images/wechatpay.jpg" alt="白宁超 微信支付"/>
        <p>微信支付</p>
      </div>
    

    
      <div id="alipay" style="display: inline-block">
        <img id="alipay_qr" src="/images/alipay.jpg" alt="白宁超 支付宝"/>
        <p>支付宝</p>
      </div>
    

    

  </div>
</div>

      </div>
    

    

    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/自然语言处理/" rel="tag"><i class="fa fa-tag"></i> 自然语言处理</a>
          
            <a href="/tags/NLP/" rel="tag"><i class="fa fa-tag"></i> NLP</a>
          
        </div>
      

      
      
        <div class="post-widgets">
        

        

        
          
          <div class="social_share">
            
               <div>
                 
  <div class="bdsharebuttonbox">
    <a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博"></a>
    <a href="#" class="bds_douban" data-cmd="douban" title="分享到豆瓣网"></a>
    <a href="#" class="bds_sqq" data-cmd="sqq" title="分享到QQ好友"></a>
    <a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间"></a>
    <a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信"></a>
    <a href="#" class="bds_tieba" data-cmd="tieba" title="分享到百度贴吧"></a>
    <a href="#" class="bds_twi" data-cmd="twi" title="分享到Twitter"></a>
    <a href="#" class="bds_fbook" data-cmd="fbook" title="分享到Facebook"></a>
    <a href="#" class="bds_more" data-cmd="more"></a>
    <a class="bds_count" data-cmd="count"></a>
  </div>
  <script>
    window._bd_share_config = {
      "common": {
        "bdText": "",
        "bdMini": "2",
        "bdMiniList": false,
        "bdPic": ""
      },
      "share": {
        "bdSize": "16",
        "bdStyle": "0"
      },
      "image": {
        "viewList": ["tsina", "douban", "sqq", "qzone", "weixin", "twi", "fbook"],
        "viewText": "分享到：",
        "viewSize": "16"
      }
    }
  </script>

<script>
  with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='/static/api/js/share.js?cdnversion='+~(-new Date()/36e5)];
</script>

               </div>
            
            
               <div id="needsharebutton-postbottom">
                 <span class="btn">
                    <i class="fa fa-share-alt" aria-hidden="true"></i>
                 </span>
               </div>
            
          </div>
        
        </div>
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2019/02/13/漫谈马尔可夫模型/" rel="next" title="漫谈马尔可夫模型">
                <i class="fa fa-chevron-left"></i> 漫谈马尔可夫模型
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2019/02/13/自然语言处理之语料库技术/" rel="prev" title="自然语言处理之语料库技术">
                自然语言处理之语料库技术 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>


  </div>


          </div>
          

  
    <div class="comments" id="comments">
      <div id="lv-container" data-id="city" data-uid="MTAyMC8zOTc5NC8xNjMyMQ=="></div>
    </div>

  
 





        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview-wrap">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview-wrap sidebar-panel">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <img class="site-author-image" itemprop="image"
                src="/../images/header.png"
                alt="白宁超" />
            
              <p class="site-author-name" itemprop="name">白宁超</p>
              <p class="site-description motion-element" itemprop="description">本站主要研究深度学习、机器学习、自然语言处理等前沿技术。ML&NLP交流群：436303759 <span><a target="_blank" href="http://shang.qq.com/wpa/qunwpa?idkey=ef3bbb679b06ac59b136c57ba9e7935ff9d3b10faeabde6e4efcafe523bbbf4d"><img border="0" src="http://pub.idqqimg.com/wpa/images/group.png" alt="自然语言处理和机器学习技术QQ交流：436303759 " title="自然语言处理和机器学习技术交流"></a></span></p>
          </div>

          
            <nav class="site-state motion-element">
              
                <div class="site-state-item site-state-posts">
                
                  <a href="/archives">
                
                    <span class="site-state-item-count">65</span>
                    <span class="site-state-item-name">日志</span>
                  </a>
                </div>
              

              
                
                
                <div class="site-state-item site-state-categories">
                  <a href="/categories/index.html">
                    
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                    <span class="site-state-item-count">29</span>
                    <span class="site-state-item-name">分类</span>
                  </a>
                </div>
              

              
                
                
                <div class="site-state-item site-state-tags">
                  <a href="/tags/index.html">
                    
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                    <span class="site-state-item-count">119</span>
                    <span class="site-state-item-name">标签</span>
                  </a>
                </div>
              
            </nav>
          

          
            <div class="feed-link motion-element">
              <a href="/atom.xml" rel="alternate">
                <i class="fa fa-rss"></i>
                RSS
              </a>
            </div>
          

          
            <div class="links-of-author motion-element">
              
                <span class="links-of-author-item">
                  <a href="https://github.com/bainingchao" target="_blank" title="GitHub" rel="external nofollow"><i class="fa fa-fw fa-github"></i>GitHub</a>
                  
                </span>
              
                <span class="links-of-author-item">
                  <a href="https://www.google.com.hk/" target="_blank" title="Google" rel="external nofollow"><i class="fa fa-fw fa-google"></i>Google</a>
                  
                </span>
              
                <span class="links-of-author-item">
                  <a href="https://www.baidu.com/" target="_blank" title="百度" rel="external nofollow"><i class="fa fa-fw fa-globe"></i>百度</a>
                  
                </span>
              
                <span class="links-of-author-item">
                  <a href="https://weibo.com/p/1005056002073632?is_all=1" target="_blank" title="微博" rel="external nofollow"><i class="fa fa-fw fa-weibo"></i>微博</a>
                  
                </span>
              
                <span class="links-of-author-item">
                  <a href="http://www.cnblogs.com/baiboy/" target="_blank" title="博客园" rel="external nofollow"><i class="fa fa-fw fa-globe"></i>博客园</a>
                  
                </span>
              
                <span class="links-of-author-item">
                  <a href="https://mp.weixin.qq.com/s/s97I4gtEJIt5rMivWMkPkQ" target="_blank" title="微信公众号" rel="external nofollow"><i class="fa fa-fw fa-weixin"></i>微信公众号</a>
                  
                </span>
              
            </div>
          

          
          

          
          

          
            
          
          

        </div>
      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#初识自然语言处理"><span class="nav-number">1.</span> <span class="nav-text">初识自然语言处理</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#自然语言处理概述"><span class="nav-number">1.1.</span> <span class="nav-text">自然语言处理概述</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#自然语言处理发展历史"><span class="nav-number">1.2.</span> <span class="nav-text">自然语言处理发展历史</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#自然语言处理工作原理"><span class="nav-number">1.3.</span> <span class="nav-text">自然语言处理工作原理</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#自然语言处理应用前景"><span class="nav-number">1.4.</span> <span class="nav-text">自然语言处理应用前景</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#自然语言处理与机器学习"><span class="nav-number">2.</span> <span class="nav-text">自然语言处理与机器学习</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#机器学习概述"><span class="nav-number">2.1.</span> <span class="nav-text">机器学习概述</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#机器学习发展历程"><span class="nav-number">2.2.</span> <span class="nav-text">机器学习发展历程</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#机器学习应用前景"><span class="nav-number">2.3.</span> <span class="nav-text">机器学习应用前景</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#自然语言处理与机器学习的联系"><span class="nav-number">3.</span> <span class="nav-text">自然语言处理与机器学习的联系</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#自然语言处理和机器学习的联系"><span class="nav-number">3.1.</span> <span class="nav-text">自然语言处理和机器学习的联系</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#寄语"><span class="nav-number">3.2.</span> <span class="nav-text">寄语</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#自然语言处理开发工具与环境"><span class="nav-number">4.</span> <span class="nav-text">自然语言处理开发工具与环境</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#Sublime-Text和Anaconda介绍"><span class="nav-number">4.1.</span> <span class="nav-text">Sublime Text和Anaconda介绍</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#开发环境安装与配置"><span class="nav-number">4.2.</span> <span class="nav-text">开发环境安装与配置</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#参考文献"><span class="nav-number">5.</span> <span class="nav-text">参考文献</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#完整代码下载"><span class="nav-number">6.</span> <span class="nav-text">完整代码下载</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#作者声明"><span class="nav-number">7.</span> <span class="nav-text">作者声明</span></a></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js">
</script>

<div class="copyright">&copy; <span itemprop="copyrightYear">2019</span>
  <span class="with-love" id="animate">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">白宁超</span>

  

  
</div>




  



  <!--<div class="powered-by">由 <a class="theme-link" target="_blank" rel="external nofollow" href="https://hexo.io">Hexo</a> 强力驱动 v3.7.1</div> -->



   <!--<span class="post-meta-divider">|</span>-->



   <!--<div class="theme-info">主题 – <a class="theme-link" target="_blank" rel="external nofollow" href="https://theme-next.org">NexT.Gemini</a> v6.4.1</div>-->




        <script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>



<div class="busuanzi-count">
  
    <span class="site-uv" title="总访客量">
      <i class="fa fa-user"></i>
      <span class="busuanzi-value" id="busuanzi_value_site_uv"></span>
    </span>
  

  
    <span class="site-pv" title="总访问量">
      <i class="fa fa-eye"></i>
      <span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
    </span>
  
</div>









        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    
	
    

    
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>


























  
  
    <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  


  


  <script type="text/javascript" src="/js/src/utils.js?v=6.4.1"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=6.4.1"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=6.4.1"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=6.4.1"></script>



  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=6.4.1"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=6.4.1"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=6.4.1"></script>



  



  
    <script type="text/javascript">
      window.livereOptions = {
        refer: '2019/02/13/自然语言处理入门/'
      };
      (function(d, s) {
        var j, e = d.getElementsByTagName(s)[0];
        if (typeof LivereTower === 'function') { return; }
        j = d.createElement(s);
        j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
        j.async = true;
        e.parentNode.insertBefore(j, e);
      })(document, 'script');
    </script>
  










  

  <script type="text/javascript">
    // Popup Window;
    var isfetched = false;
    var isXml = true;
    // Search DB path;
    var search_path = "search.xml";
    if (search_path.length === 0) {
      search_path = "search.xml";
    } else if (/json$/i.test(search_path)) {
      isXml = false;
    }
    var path = "/" + search_path;
    // monitor main search box;

    var onPopupClose = function (e) {
      $('.popup').hide();
      $('#local-search-input').val('');
      $('.search-result-list').remove();
      $('#no-result').remove();
      $(".local-search-pop-overlay").remove();
      $('body').css('overflow', '');
    }

    function proceedsearch() {
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay"></div>')
        .css('overflow', 'hidden');
      $('.search-popup-overlay').click(onPopupClose);
      $('.popup').toggle();
      var $localSearchInput = $('#local-search-input');
      $localSearchInput.attr("autocapitalize", "none");
      $localSearchInput.attr("autocorrect", "off");
      $localSearchInput.focus();
    }

    // search function;
    var searchFunc = function(path, search_id, content_id) {
      'use strict';

      // start loading animation
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay">' +
          '<div id="search-loading-icon">' +
          '<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>' +
          '</div>' +
          '</div>')
        .css('overflow', 'hidden');
      $("#search-loading-icon").css('margin', '20% auto 0 auto').css('text-align', 'center');

      

      $.ajax({
        url: path,
        dataType: isXml ? "xml" : "json",
        async: true,
        success: function(res) {
          // get the contents from search data
          isfetched = true;
          $('.popup').detach().appendTo('.header-inner');
          var datas = isXml ? $("entry", res).map(function() {
            return {
              title: $("title", this).text(),
              content: $("content",this).text(),
              url: $("url" , this).text()
            };
          }).get() : res;
          var input = document.getElementById(search_id);
          var resultContent = document.getElementById(content_id);
          var inputEventFunction = function() {
            var searchText = input.value.trim().toLowerCase();
            var keywords = searchText.split(/[\s\-]+/);
            if (keywords.length > 1) {
              keywords.push(searchText);
            }
            var resultItems = [];
            if (searchText.length > 0) {
              // perform local searching
              datas.forEach(function(data) {
                var isMatch = false;
                var hitCount = 0;
                var searchTextCount = 0;
                var title = data.title.trim();
                var titleInLowerCase = title.toLowerCase();
                var content = data.content.trim().replace(/<[^>]+>/g,"");
                
                var contentInLowerCase = content.toLowerCase();
                var articleUrl = decodeURIComponent(data.url);
                var indexOfTitle = [];
                var indexOfContent = [];
                // only match articles with not empty titles
                if(title != '') {
                  keywords.forEach(function(keyword) {
                    function getIndexByWord(word, text, caseSensitive) {
                      var wordLen = word.length;
                      if (wordLen === 0) {
                        return [];
                      }
                      var startPosition = 0, position = [], index = [];
                      if (!caseSensitive) {
                        text = text.toLowerCase();
                        word = word.toLowerCase();
                      }
                      while ((position = text.indexOf(word, startPosition)) > -1) {
                        index.push({position: position, word: word});
                        startPosition = position + wordLen;
                      }
                      return index;
                    }

                    indexOfTitle = indexOfTitle.concat(getIndexByWord(keyword, titleInLowerCase, false));
                    indexOfContent = indexOfContent.concat(getIndexByWord(keyword, contentInLowerCase, false));
                  });
                  if (indexOfTitle.length > 0 || indexOfContent.length > 0) {
                    isMatch = true;
                    hitCount = indexOfTitle.length + indexOfContent.length;
                  }
                }

                // show search results

                if (isMatch) {
                  // sort index by position of keyword

                  [indexOfTitle, indexOfContent].forEach(function (index) {
                    index.sort(function (itemLeft, itemRight) {
                      if (itemRight.position !== itemLeft.position) {
                        return itemRight.position - itemLeft.position;
                      } else {
                        return itemLeft.word.length - itemRight.word.length;
                      }
                    });
                  });

                  // merge hits into slices

                  function mergeIntoSlice(text, start, end, index) {
                    var item = index[index.length - 1];
                    var position = item.position;
                    var word = item.word;
                    var hits = [];
                    var searchTextCountInSlice = 0;
                    while (position + word.length <= end && index.length != 0) {
                      if (word === searchText) {
                        searchTextCountInSlice++;
                      }
                      hits.push({position: position, length: word.length});
                      var wordEnd = position + word.length;

                      // move to next position of hit

                      index.pop();
                      while (index.length != 0) {
                        item = index[index.length - 1];
                        position = item.position;
                        word = item.word;
                        if (wordEnd > position) {
                          index.pop();
                        } else {
                          break;
                        }
                      }
                    }
                    searchTextCount += searchTextCountInSlice;
                    return {
                      hits: hits,
                      start: start,
                      end: end,
                      searchTextCount: searchTextCountInSlice
                    };
                  }

                  var slicesOfTitle = [];
                  if (indexOfTitle.length != 0) {
                    slicesOfTitle.push(mergeIntoSlice(title, 0, title.length, indexOfTitle));
                  }

                  var slicesOfContent = [];
                  while (indexOfContent.length != 0) {
                    var item = indexOfContent[indexOfContent.length - 1];
                    var position = item.position;
                    var word = item.word;
                    // cut out 100 characters
                    var start = position - 20;
                    var end = position + 80;
                    if(start < 0){
                      start = 0;
                    }
                    if (end < position + word.length) {
                      end = position + word.length;
                    }
                    if(end > content.length){
                      end = content.length;
                    }
                    slicesOfContent.push(mergeIntoSlice(content, start, end, indexOfContent));
                  }

                  // sort slices in content by search text's count and hits' count

                  slicesOfContent.sort(function (sliceLeft, sliceRight) {
                    if (sliceLeft.searchTextCount !== sliceRight.searchTextCount) {
                      return sliceRight.searchTextCount - sliceLeft.searchTextCount;
                    } else if (sliceLeft.hits.length !== sliceRight.hits.length) {
                      return sliceRight.hits.length - sliceLeft.hits.length;
                    } else {
                      return sliceLeft.start - sliceRight.start;
                    }
                  });

                  // select top N slices in content

                  var upperBound = parseInt('1');
                  if (upperBound >= 0) {
                    slicesOfContent = slicesOfContent.slice(0, upperBound);
                  }

                  // highlight title and content

                  function highlightKeyword(text, slice) {
                    var result = '';
                    var prevEnd = slice.start;
                    slice.hits.forEach(function (hit) {
                      result += text.substring(prevEnd, hit.position);
                      var end = hit.position + hit.length;
                      result += '<b class="search-keyword">' + text.substring(hit.position, end) + '</b>';
                      prevEnd = end;
                    });
                    result += text.substring(prevEnd, slice.end);
                    return result;
                  }

                  var resultItem = '';

                  if (slicesOfTitle.length != 0) {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + highlightKeyword(title, slicesOfTitle[0]) + "</a>";
                  } else {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + title + "</a>";
                  }

                  slicesOfContent.forEach(function (slice) {
                    resultItem += "<a href='" + articleUrl + "'>" +
                      "<p class=\"search-result\">" + highlightKeyword(content, slice) +
                      "...</p>" + "</a>";
                  });

                  resultItem += "</li>";
                  resultItems.push({
                    item: resultItem,
                    searchTextCount: searchTextCount,
                    hitCount: hitCount,
                    id: resultItems.length
                  });
                }
              })
            };
            if (keywords.length === 1 && keywords[0] === "") {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-search fa-5x" /></div>'
            } else if (resultItems.length === 0) {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-frown-o fa-5x" /></div>'
            } else {
              resultItems.sort(function (resultLeft, resultRight) {
                if (resultLeft.searchTextCount !== resultRight.searchTextCount) {
                  return resultRight.searchTextCount - resultLeft.searchTextCount;
                } else if (resultLeft.hitCount !== resultRight.hitCount) {
                  return resultRight.hitCount - resultLeft.hitCount;
                } else {
                  return resultRight.id - resultLeft.id;
                }
              });
              var searchResultList = '<ul class=\"search-result-list\">';
              resultItems.forEach(function (result) {
                searchResultList += result.item;
              })
              searchResultList += "</ul>";
              resultContent.innerHTML = searchResultList;
            }
          }

          if ('auto' === 'auto') {
            input.addEventListener('input', inputEventFunction);
          } else {
            $('.search-icon').click(inputEventFunction);
            input.addEventListener('keypress', function (event) {
              if (event.keyCode === 13) {
                inputEventFunction();
              }
            });
          }

          // remove loading animation
          $(".local-search-pop-overlay").remove();
          $('body').css('overflow', '');

          proceedsearch();
        }
      });
    }

    // handle and trigger popup window;
    $('.popup-trigger').click(function(e) {
      e.stopPropagation();
      if (isfetched === false) {
        searchFunc(path, 'local-search-input', 'local-search-result');
      } else {
        proceedsearch();
      };
    });

    $('.popup-btn-close').click(onPopupClose);
    $('.popup').click(function(e){
      e.stopPropagation();
    });
    $(document).on('keyup', function (event) {
      var shouldDismissSearchPopup = event.which === 27 &&
        $('.search-popup').is(':visible');
      if (shouldDismissSearchPopup) {
        onPopupClose();
      }
    });
  </script>





  

  

  
<script>
(function(){
    var bp = document.createElement('script');
    var curProtocol = window.location.protocol.split(':')[0];
    if (curProtocol === 'https') {
        bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';        
    }
    else {
        bp.src = 'http://push.zhanzhang.baidu.com/push.js';
    }
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(bp, s);
})();
</script>


  
  

  
  

  
    
      <script type="text/x-mathjax-config">
    MathJax.Hub.Config({
      tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
        processEscapes: true,
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
      },
      TeX: {equationNumbers: { autoNumber: "AMS" }}
    });
</script>

<script type="text/x-mathjax-config">
    MathJax.Hub.Queue(function() {
      var all = MathJax.Hub.getAllJax(), i;
        for (i=0; i < all.length; i += 1) {
          all[i].SourceElement().parentNode.className += ' has-jax';
        }
    });
</script>
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/mathjax@2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

    
  


  
  
  
  <script src="/lib/needsharebutton/needsharebutton.js"></script>

  <script>
    
      pbOptions = {};
      
          pbOptions.iconStyle = "box";
      
          pbOptions.boxForm = "horizontal";
      
          pbOptions.position = "bottomCenter";
      
          pbOptions.networks = "Weibo,Wechat,Douban,QQZone,Linkedin,Facebook";
      
      new needShareButton('#needsharebutton-postbottom', pbOptions);
    
    
  </script>

  

  

  

  

  

  

  <!-- 页面点击小红心 -->
	<script type="text/javascript" src="../js/src/love.js"></script><!-- hexo-inject:begin --><!-- Begin: Injected MathJax -->
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({"tex2jax":{"inlineMath":[["$","$"],["\\(","\\)"]],"skipTags":["script","noscript","style","textarea","pre","code"],"processEscapes":true},"TeX":{"equationNumbers":{"autoNumber":"AMS"}}});
</script>

<script type="text/x-mathjax-config">
  MathJax.Hub.Queue(function() {
    var all = MathJax.Hub.getAllJax(), i;
    for(i=0; i < all.length; i += 1) {
      all[i].SourceElement().parentNode.className += ' has-jax';
    }
  });
</script>

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js">
</script>
<!-- End: Injected MathJax -->
<!-- hexo-inject:end -->
</body>
</html>
